//package chapter09plus
//
///**
//  *
//  * @author Pop
//  * @date 2022/7/5 23:03
//  *
//  *      映射转换包括，隐式函数，隐式类，隐式参数
//  */
//object Test02_Implicit {
//
//  // 放到这里后，你还必须保证，这个声明必须写在要隐式转换的前面
//  implicit  class MyRichInt1(val self:Int){
//    // 自定义比较大小的方法
//    def myMax(n:String):Int = if(n=="") 123 else 123
//    def myMin(n:Int):Int = if(n>="") 123 else 123
//  }
//
//  implicit def t1(elf:Int):MyRichInt = new MyRichInt(3)
//
//
//
//  def main(args: Array[String]): Unit = {
//      // 因为int本身并没有这个方法，所以scala第一次编译会发现
//    // 无法编译通过，所以第二次编译会去寻找当前上下文，是否有可以隐式转换
//      println(12.myMax1(2))
//
//
//
//
//    // 被声明的隐式参数，在方法或者构造器中，表示这个参数可以不传
//    // 当不传的时候，编译器会在上下文寻找可以匹配这个参数的隐式转换
//
//    implicit val str:String = "alice"
//
//    // 因为隐式参数，认的是类型，也就是 String的类型，而不是参数名
//    // 所以，你定义多个相同类型的隐式参数，编译器是无法通过的
//
//    def sayHello(name:String="alice"):Unit={
//      println("123")
//    }
//    sayHello()
//    // 隐式参数也可以有默认值，但是会覆盖掉，隐式参数的优先级更高
//    def sayHello1(implicit name:String="alice"):Unit={
//      println("123")
//    }
//
////    sayHello1()
//    sayHello1
//
//    /**
//      * 至于为什么要去掉括号，是因为以上隐式参数的表达，其实是
//      * 科里化的一种体现
//      * 完整的写法应该是
//      *
//      * def sayHello1()(implicit name:String):Unit={
//      * println("123")
//      * }
//      *
//      * 因为在调用的时候，括号里没传参数可以省略，所以前面的括号可以不写
//      * 而第二的调用参数可以通过上下文寻找到，所以也可以不写
//      */
//
//    implicit val in:Int = 0
//
//    // 另一种简便方法
//    def hiAge():Unit = {
//      println("hi, "+implicitly[Int])
//    }
//    hiAge
//  }
//}
//
//// 自定类 implicit 无法定义到最外边，必须定义在其他类或者对象里面
//class MyRichInt(val self:Int){
//  // 自定义比较大小的方法
//  def myMax1(n:Int):Int = if(n<self) self else n
//  def myMin1(n:Int):Int = if(n>self) self else n
//}
//
